{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8067a7d6",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\liangcheng\\AppData\\Local\\Temp\\ipykernel_20024\\1805690707.py:20: FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n",
      "  df['is_prev_valid'] = df['is_valid'].shift(1).fillna(False)\n"
     ]
    },
    {
     "data": {
      "image/png": "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unXrXne9n/xkZWVpypQp6tixY6GmchVEixYt9Msvv6h27dr2EC1nwfsc1372rictLa1QC4Lnt6ZUXnKmbXXs2FGjR49Wx44dtWrVKjVo0EDR0dHq3bu3xowZo379+t3wWG5ubvruu+9UsmRJlShRQtu2bctzu5SUlJueOpqXnFE558+f1y+//KIdO3aobNmyeu655yRJ586dk7+/v44cOaIDBw6oevXquX5+C2LYsGF688039fjjj+c57e5W7dq1S9OnT9fatWsdvt8TJ07U+fPn9dFHH8kwDD3xxBPaunXrdW9mcDOOHj2qRo0aKTMzU1arVVlZWQ79EydO1GeffSYfHx/5+PjI19fX/si5EUNeypQpow8++EADBw6Uu7u79u/fn+dosxzly5fX22+/reXLl2v8+PHKysrSmjVr1KBBA61YsUKvvfaaFixYYA/ojx49mm9gmpaWppEjR2rIkCEOQSUA4O7Db3kAQJF0bRB0zz33KD4+Ps/Hzp07HfbLWXhYks6ePatRo0apTZs2mjlzpp5//nlZLJZC19K8eXO1b99e0tX1pD766CO98cYbOn/+vEqXLq1+/fopLS1Ne/fuzTekaNWqlfr376/IyEglJSU59C1dulTHjh3T9OnTC11bt27dVKxYMYWHh2v16tVauHCh/vnPf2rgwIH2PzA/+OAD/fbbb2rWrJkef/xxjRw5Ui+99JLuueceSVdHD5UrV07NmjXT008/rQ4dOqhx48bq2rWrJKlevXoaMGCAHn/8cfXp00dNmjRRWlqafd0kDw8PTZgwQRMnTlTnzp3VsmVLrVq1Su+++26hz0eSRo0apQMHDuidd9657nZbt25Vz549cy2UfO1IpJxFwnOYTCY1aNBAkuzfh7+GUtd+hvISFRWl8uXLa9euXfbFxfPy13Dr66+/dhjtZBhGgUaJvP7663rppZf0wAMP6LnnnlPnzp31/vvvF2hx6+zsbBmGoWrVquWaznWtjIwMVa9e3T7iqKDBXH5iYmLUpEkTlSxZUvfcc49efvllHTt2TFWqVLGPMGratKlatmyp4OBgffHFF5KujkjKCa0Kqnfv3qpTp4569eqV6/t9qy5duqSIiAh16dLFYX2tmTNnatSoUZo3b558fX01duxYGYZx3Tse3qzy5ctr2bJl2rp1qw4cOKDjx48rMTFRly9fVqVKlfTuu+8qLS1N58+f1/Hjx3Xw4EHt3r1bL7/8cr7r6NlsNn355Zd6/fXX1aRJExUvXlwRERFavXr1db/3s2bN0vjx4/Xqq69qx44dqlOnjj766CP16NFDn3zyiXr27Gnf9siRI3lOxczKytLAgQPl6emp11577ZbfHwDAnY2RUgCAIiln3aZr133KT1xcnI4fP27fz8PDQ5cuXVLXrl3l7e2tb7/9VmlpaerTp4+qVKmiKlWqKD09XZs3b1ZQUJA8PDzsi5FfuHBBYWFhDiMuevXqpV9++UWDBw/W7NmzNWTIEL3++uu6cuWKJk+erNmzZ6tjx46qVauWXn75ZfXv398+JezixYv2BYP79++vjRs3au/evTp//rzS0tIUFxenkSNHql+/frJYLNqzZ49sNpsaNmxYoLWOihcvrjVr1mjIkCF64oknVKJECb388ssOC1/fe++92rVrl0aOHKk//vhD48aN07Bhw+z9xYoV05YtWzRq1Cht27ZNERERGjt2rMPC0DNmzFDt2rW1aNEi1apVS0uXLnWYmtO3b18FBQXZ19xZunSpPdQqqMuXLysqKkrTp0/XxIkTHQKfnJFDCxYssK958+WXX2rlypX2xcWzs7Ml5R5RlzMi7K8OHjwoLy+vXGvn3H///bnWwsrOzraP4AkPD1dCQoLat2+f7zpCGRkZslqtOnr0qDIzM5WZmamzZ8/mmk5ltVp19uxZxcTEKCQkRAEBAbmO9fvvv0u6Gv4tWLBAwcHB8vLy0pEjR/IdBXNt3TnvS46cfWNiYuzB5Zo1a3T27Fn75zYnmCvsQuc5r1W3bl01btxYkZGR6ty5s330zLx583TfffcpLi5O48aN02uvvaYNGzbokUce0Z9//qkdO3Y43FSgIEwmk7755hu1adNG7dq106pVq6474qcwNm/erFOnTmn16tWSro76GjZsmBYuXKiZM2faaw0ICFB0dLTatm2rRo0aacyYMRo0aJD9c3srvL299dBDD+XZ5+Pjo3379un8+fMOP69paWl64403ZDabdejQIbm5uSk5OVm//vqrVqxYoUWLFik1NVVvvfWWhgwZolOnTumll17So48+qsqVK+uRRx7RP/7xD9WoUUMNGza0n8eLL76oF198UadPn9a0adM0depUlSpVShs2bFDz5s11+PBh7d+/X//973/1559/qmHDhg71ZmZm6vHHH9e+ffu0adOm2/L+AADucAYAAEXQmDFjDEmFflgsFsMwDGPIkCFG8eLFjZ07dzocd82aNcaAAQOMhg0bGkFBQYbJZHLYPyQkxLDZbIZhGMaRI0eMevXqGX5+foaHh4fRsWNH4+eff86z3r179xqdO3c2PD09jT/++MPevnTpUsNsNhvFihUzAgICrvvw9/c3fH19DbPZbBw+fPhvemfvTMeOHTMqVKhgmM1m4+OPP87Vf+XKFaN58+YO36+goCDjX//6l32btWvXGn+99Hn44YeNN9980/78zz//NIYOHWo888wzRsmSJY1HH320QPV17NjR6NixY4HPp1+/fkaHDh2M7t27G76+voa/v3++3/fixYsb3t7exrp16wzDMIxFixYZb7/9ttG9e3cjJCTEMJvNxiOPPGL85z//MdLS0owpU6YY9957ryHJ8Pf3N5o2bWp07drV2Lx5c646ypQpY3z22WcObTt37jQCAgJy/ey0bNnSsFqthmEYxpYtWwxJxoYNGwp0vikpKYYk45NPPrnudhMmTDDatWtnxMbGOrSvXbvWKFu2rFGpUiXj9OnTBXrNv0pKSjLee+89Iysr66b2z8/x48cNwzCM33//3fDz8zPKlCljrF+/Ps9tL168aHTt2tWQZMyZM+e21pGXOXPmGMHBwXn+LixRooSxcuVKwzAM4+jRo4aHh4chyahYsaLx7rvvGhcvXsx1vN27dxsDBw40goKCDElG7dq17b8Pc+zYscO45557jN69exurVq1y6Dtx4oRxzz33GM2bNzcmTpyYZ80TJky46e8xAKDoMRnGLY6/BgDABS5duqT09HSVLVv2po9x/Pjx6y60K12dppSRkSGbzWa/lfm1o2S+/vprBQcH6x//+EeuaV43+5rI24YNGxQQEJDvlKMbOXjwoL788ktNmTLF3rZs2TL790+6+v2uUaOGfH191aFDB40cOTLP0Ul/1bZtW5lMJq1du/amaiuMKVOmaObMmWrevLkefvhhtW/fPs91ig4cOKC1a9dq9+7dSk5O1rJlywq8Po/xf3cezGE2m3OtheZsWVlZys7Odnkd1/P999+rTZs2N1zrbOPGjfmObnKV+fPnq3r16goLC7vh5yQrK0v79u2TyWTKc4qqcRNrfwEA/jcRSgEAAAAAAMDpWOgcAAAAAAAATkcoBQAAAAAAAKcj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atXsfTExMQoLC1OJEiUUFRUlwzDsfZs2bVKtWrUUHBysSZMmOe8kAQAAAAAAkCeXhFJHjx7VM888o3HjxikhIUE1atRQZGSkjh49qnfffVfLli1TXFycqlatqqefftq+3+7du7VixQolJSUpKSlJe/fulSRZrVZ17txZjRs31u7duxUbG6u5c+dKkhITE9WlSxdFRERo+/btWrBggTZs2OCCswYAAAAAAEAOl4RSBw8e1Lhx4/TEE0+odOnSevHFF7V3717t3btXzZo1U6NGjVSxYkU9++yzOnLkiCQpMzNTBw4cUMuWLRUYGKjAwEAVL15ckrRq1SolJydr0qRJqlq1qsaOHavZs2dLkhYsWKBy5cpp9OjRql69ut566y17HwAAAAAAAFzDJaFUp06dNHDgQPvzQ4cOqXr16qpdu7bWr1+vX3/9VcnJyfr888/Vrl07SdL+/fuVnZ2thg0bqlixYnrkkUd0/PhxSdK+ffvUrFkz+fj4SJLq16+v2NhYe1/r1q1lMpkkSU2bNtWePXuceboAAAAAAAD4C3dXF5CRkaGPP/5YQ4cOVe3atdWzZ0/dd999kqTQ0FD9/PPPkqTY2FjVrFlTn376qYKDgzVkyBANHDhQq1evlsViUWhoqP2YJpNJZrNZSUlJslgsql27tr3P399fp06dyrceq9Uqq9Vqf26xWCRJNptNNpvttp47AADAzcq5LuH6BAAA3GkKen3i8lDq7bfflq+vryIjI7Vz5079+OOP2rFjh+69916NHz9e4eHh2rlzp3r37q3evXvb9/v8888VGhoqi8Uid3d3eXl5ORzX29tbaWlpufpy2vPz4YcfasyYMbnao6Oj7SOxAAAA7hRr1651dQkAAAAOrpe7XMulodT69es1bdo07dixQx4eHlq0aJGeeuop3X///ZKk999/X9OnT9e+ffvUsGFDh31LlSql7OxsnT59WkFBQYqJiXHoT0lJkaenp4KCgpSYmJirPT8jRozQ0KFD7c8tFotCQkLUvn17+fv734azBgAAuHU2m01r165Vu3bt5OHh4epyAAAA7HJmnd2Iy0Kp+Ph4RUREaNq0afbpddnZ2Tp//rx9m5SUFKWlpSkrK0tRUVG677771KtXL0nS9u3b5ebmppCQEIWFhWnmzJkOx7ZarQoKClJYWJgWLlxo79u7d6/Kly+fb11eXl65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",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 参数\n",
    "n_future = 8\n",
    "initial_capital = 30000  # 固定资金\n",
    "capital = initial_capital\n",
    "capital_curve = []\n",
    "capital_dates = []\n",
    "\n",
    "# 读取数据\n",
    "file_path = \"../../../data/恒生医疗ETF_159506_5分_20240601_20250606.csv\"\n",
    "df = pd.read_csv(file_path, encoding='utf-8')\n",
    "df.columns = [col.strip() for col in df.columns]\n",
    "\n",
    "# 涨幅过滤\n",
    "df['change_pct'] = (df['收盘'] - df['开盘']) / df['开盘']\n",
    "df['is_valid'] = (df['change_pct'] > 0.005) & (df['change_pct'] < 0.01)\n",
    "df['is_prev_valid'] = df['is_valid'].shift(1).fillna(False)\n",
    "df['is_selected'] = df['is_valid'] & (~df['is_prev_valid'])\n",
    "selected_indices = df.index[df['is_selected']].tolist()\n",
    "\n",
    "in_position = False\n",
    "\n",
    "for idx in selected_indices:\n",
    "    if in_position:\n",
    "        continue\n",
    "    if idx + n_future >= len(df):\n",
    "        break\n",
    "\n",
    "    # 基础信息\n",
    "    entry_open = df.loc[idx, '开盘']\n",
    "    entry_close = df.loc[idx, '收盘']\n",
    "    entry_low = df.loc[idx, '最低']\n",
    "    entry_price = entry_close\n",
    "    stop_loss_price = entry_low * (1 - 0.0015)\n",
    "\n",
    "    range1 = entry_open + 0.5 * (entry_close - entry_open)\n",
    "    range2 = entry_open + 0.1 * (entry_close - entry_open)\n",
    "\n",
    "    future = df.loc[idx + 1: idx + n_future].copy()\n",
    "    future.reset_index(drop=True, inplace=True)\n",
    "\n",
    "    buy_prices = [entry_price]\n",
    "    units = 1\n",
    "\n",
    "    # 加仓判断\n",
    "    for i, row in future.iterrows():\n",
    "        low = row['最低']\n",
    "        if units == 1 and low < range1:\n",
    "            buy_prices.append(low)\n",
    "            units += 1\n",
    "        elif units == 2 and low < range2:\n",
    "            buy_prices.append(low)\n",
    "            units += 1\n",
    "        if units == 3:\n",
    "            break\n",
    "\n",
    "    # 成本均价\n",
    "    cost_avg = np.mean(buy_prices)\n",
    "    total_position = units * 10000\n",
    "\n",
    "    # 检查是否触发止损 or 连续最低价创新低止盈\n",
    "    stop = False\n",
    "    exit_price = None\n",
    "    lows = future['最低'].values\n",
    "    for i in range(1, len(lows)):\n",
    "        if lows[i] < stop_loss_price:\n",
    "            stop = True\n",
    "            exit_price = lows[i]\n",
    "            break\n",
    "        if i >= 1 and lows[i] < lows[i - 1]:\n",
    "            if i >= 2 and lows[i - 1] < lows[i - 2]:\n",
    "                # 连续两根创新低，止盈\n",
    "                stop = False\n",
    "                exit_price = df.loc[idx + 1 + i, '最高']\n",
    "                break\n",
    "\n",
    "    if exit_price is None:\n",
    "        # 没触发任何，用最后一个收盘价结算\n",
    "        exit_price = df.loc[idx + n_future, '收盘']\n",
    "\n",
    "    # 盈亏计算\n",
    "    gain_pct = (exit_price - cost_avg) / cost_avg\n",
    "    profit = gain_pct * total_position\n",
    "    capital += profit\n",
    "    capital = min(capital, 30000)  # 不允许超过本金（全部资金入场）\n",
    "\n",
    "    # 记录\n",
    "    capital_curve.append(capital)\n",
    "    capital_dates.append(df.loc[idx + n_future, '时间'])\n",
    "\n",
    "    in_position = True  # 下一笔不能再做（直到这笔结束）\n",
    "\n",
    "# 画图：市值变化\n",
    "plt.figure(figsize=(12, 6))\n",
    "plt.plot(capital_dates, capital_curve, color='darkred', linewidth=2)\n",
    "plt.xticks(rotation=-90)\n",
    "plt.title(f'固定资金 {initial_capital} 元的市值变化曲线（一次一笔交易）')\n",
    "plt.xlabel('时间')\n",
    "plt.ylabel('当前总市值（元）')\n",
    "plt.grid(True)\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
